package tests;

import utilitarios.DireccionDerecha;
import utilitarios.DireccionIzquierda;
import utilitarios.PuntoXY;
import modelo.Cuartel;
import modelo.Escenario;
import modelo.TanqueAlgo;
import modelo.TanqueEnemigo;
import modelo.TanqueMirage;
import junit.framework.TestCase;

public class PruebasPuntosYVidas extends TestCase {
	
	public void testSiAlgoTankEsDestruidoPierde1Vida() {
		
		// ARRANGE
		//
		// CUARTEL        ALGOTANK   <-     ENEMIGO
		Escenario escenario = new Escenario(300, 300);
		
		TanqueAlgo algoTank = new TanqueAlgo(escenario, new PuntoXY(70, 30));
		Cuartel cuartel = new Cuartel(escenario, new PuntoXY(30, 30), algoTank);
		TanqueEnemigo enemigo = new TanqueMirage(escenario, new PuntoXY(130, 30), cuartel);

		
		escenario.agregarObjeto(algoTank);
		escenario.agregarObjeto(enemigo);
		escenario.agregarObjeto(cuartel);
		
		int vidasIniciales = algoTank.getVidas();
		
		// ACT
		for (int i = 0; i < 150; i++) {
			enemigo.detener();
			enemigo.girar(new DireccionIzquierda());
			escenario.vivir();
		}
		
		// ASSERT
		assertEquals(0.0, algoTank.getResistencia());
		assertEquals(true, algoTank.debeMorir());
		assertEquals(vidasIniciales - 1, algoTank.getVidas());
		
		
	}
	
	public void testSiEnemigosDestruyenCuartelAlgoTankPierde1Vida() {
		
		// ARRANGE
		//
		// CUARTEL        ALGOTANK   <-     ENEMIGO
		Escenario escenario = new Escenario(300, 300);
		
		TanqueAlgo algoTank = new TanqueAlgo(escenario, new PuntoXY(270, 270));
		Cuartel cuartel = new Cuartel(escenario, new PuntoXY(70, 60), algoTank);
		TanqueEnemigo enemigo = new TanqueMirage(escenario, new PuntoXY(130, 60), cuartel);

		escenario.agregarObjeto(algoTank);
		escenario.agregarObjeto(enemigo);
		escenario.agregarObjeto(cuartel);
		
		int vidasIniciales = algoTank.getVidas();
		
		// ACT
		for (int i = 0; i < 150; i++) {
			enemigo.girar(new DireccionIzquierda());
			enemigo.detener();
			escenario.vivir();
		}
		
		// ASSERT
		assertEquals(true, cuartel.debeMorir());
		assertEquals(vidasIniciales - 1, algoTank.getVidas());
		
	}

	
	public void testSiAlgoTankDestruyeTanqueMirageGana50Puntos() {
	    
	    // ARRANGE
        //
        // ALGOTANK ->        ENEMIGO
        Escenario escenario = new Escenario(300, 300);
        
        TanqueAlgo algoTank = new TanqueAlgo(escenario, new PuntoXY(100, 100));
        algoTank.girar(new DireccionDerecha());
        
        Cuartel cuartel = new Cuartel(escenario, new PuntoXY(200, 200), algoTank);
        TanqueEnemigo enemigo = new TanqueMirage(escenario, new PuntoXY(150, 100), cuartel);

        escenario.agregarJugador(algoTank);
        escenario.agregarObjeto(enemigo);
        escenario.agregarCuartel(cuartel);
        
        int puntosIniciales = algoTank.getPuntos();
        
        // ACT
        for (int i = 0; i < 300; i++) {
            enemigo.detener();
            algoTank.disparar();
            escenario.vivir();
        }
        
        // ASSERT
        assertEquals(puntosIniciales+50, algoTank.getPuntos());
		
	}

}
